#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */
#include <getopt.h>

/*
struct option {
	const char *name;
	int         has_arg;
	int        *flag;
	int         val;
};
 */
int main(int argc, char **argv) {
	int c;
	int digit_optind = 0;

	while (1) {
		int this_option_optind = optind ? optind : 1;
		int option_index = 0;
		static struct option long_options[] = {
			{"add",     required_argument, 0, 'a' },
			{"append",  no_argument,       0, 'p' },
			{"delete",  required_argument, 0, 'd' },
			{"verbose", no_argument,       0, 'v' },
			{"create",  required_argument, 0, 'c' },
			{"file",    required_argument, 0, 'f' },
			{0,         0,                 0,  0 }
		};

		//c = getopt_long_only(argc, argv, "a:pd:vc:f:", long_options, &option_index);
		c = getopt_long_only(argc, argv, "", long_options, &option_index);
		if (c == -1)
			break;
		switch (c) {
		case 0:
			printf("option %s", long_options[option_index].name);
			if (optarg)
				printf(" with arg %s", optarg);
			printf("\n");
			break;

		case 'a':
			printf("option 'add' with '%s'\n", optarg);
			break;
		case 'd':
			printf("option 'delete' with '%s'\n", optarg);
			break;
		case 'c':
			printf("option 'create' with '%s'\n", optarg);
			break;
		case 'f':
			printf("option 'file' with '%s'\n", optarg);
			break;

		case 'p':
			printf("option 'append'\n");
			break;
		case 'v':
			printf("option 'verbose'\n");
			break;

		case '?':
			break;

		default:
			printf("?? getopt returned character code 0%o ??\n", c);
		}
	}

	if (optind < argc) {
		printf("non-option ARGV-elements: ");
		while (optind < argc)
			printf("%s ", argv[optind++]);
		printf("\n");
	}

	exit(EXIT_SUCCESS);
}
